package com.test19_多线程;

/**
 * 线程同步
 */
public class Demo07_ThreadSync {
    private static int ticket = 10;  // 总票数

    public static void main(String[] args) {
//        test1();
//        test2();
        test3();
    }

    /**
     * 多线程同步问题
     */
    public static void test1() {
        Runnable body = () -> {
            while (true) {
                if (ticket > 0) {   // 当前有剩余票
                    try {
                        Thread.sleep(100);  // 模拟操作延时
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("【" + Thread.currentThread().getName() + "】售票，当前的剩余票数：" + (--ticket));
                } else {    // 结束售票
                    break;
                }
            }
        };
        for (int x = 0; x < 5; x++) {
            new Thread(body, "票贩子-" + x).start();
        }
    }

    /**
     * 线程同步处理
     */
    public static void test2() {
        Object lock = new Object();
        Runnable body = () -> {
            while (true) {
                synchronized (lock) {
                    if (ticket > 0) {   // 当前有剩余票
                        try {
                            Thread.sleep(100);  // 模拟操作延时
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println("【" + Thread.currentThread().getName() + "】售票，当前的剩余票数：" + (--ticket));
                    } else {    // 结束售票
                        break;
                    }
                }
            }
        };
        for (int x = 0; x < 5; x++) {
            new Thread(body, "票贩子-" + x).start();
        }
    }

    /**
     * 通过同步方法进行同步控制
     */
    public static void test3() {
        Runnable body = () -> {
            while (sale()) {    // 要持续卖票处理
            }
        };
        for (int x = 0; x < 5; x++) {
            new Thread(body, "票贩子-" + x).start();
        }
    }

    /** 售票处理方法 */
    public static synchronized boolean sale() {
        if (ticket > 0) {   //当前有剩余票
            try {
                Thread.sleep(100);  // 模拟操作延时
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("【" + Thread.currentThread().getName() + "】售票，当前的剩余票数：" + (--ticket));
            return true;
        } else {
            return false;
        }
    }
}
